#ifndef MQCONFIGMANAGER_H
#define MQCONFIGMANAGER_H

#include <QObject>
#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QMutex>
#include <QPair>

/**
 * @brief MQ配置结构体 - 连接参数
 * 仅包含用户可配置的基本连接信息，与JSON配置文件一一对应
 */
struct MQConnectionConfig {
    QString hostname = "192.168.10.162";
    int port = 5672;
    QString username = "guest";
    QString password = "guest";
    QString vhost = "/";
};

// 性能、可靠性、日志配置已硬编码到MQClient中，不再需要配置结构体

/**
 * @brief MQ配置结构体 - 交换机配置
 */
struct MQExchangeConfig {
    QString name = "test_exchange";
    QString type = "topic";
    bool durable = true;
};

/**
 * @brief MQ配置结构体 - 队列配置
 */
struct MQQueueConfig {
    QString name = "test_queue";
    bool durable = true;
    bool exclusive = false;
    bool autoDelete = false;
};

/**
 * @brief MQ配置结构体 - 绑定配置
 */
struct MQBindingConfig {
    QString routingKey = "agv.task.execute";           // 发布消息时使用的路由键
    QString queue_routing_key = "agv.task.*";          // 队列绑定时使用的路由键（支持通配符）
};

/**
 * @brief MQ配置结构体 - 业务配置
 */
struct MQBusinessConfig {
    MQExchangeConfig defaultExchange;
    MQQueueConfig defaultQueue;
    MQBindingConfig defaultBinding;
};

/**
 * @brief MQ完整配置结构体
 */
struct MQConfig {
    MQConnectionConfig connection;
    MQBusinessConfig business;
};

/**
 * @brief MQ配置管理器类
 * 负责读取、保存和管理MQ配置文件
 */
class MQConfigManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取配置管理器单例实例
     * @return 配置管理器实例指针
     */
    static MQConfigManager* getInstance();

    /**
     * @brief 加载配置文件
     * @param configPath 配置文件路径，默认为mqconfig.json
     * @return 加载是否成功
     */
    bool loadConfig(const QString& configPath = "mqconfig.json");

    /**
     * @brief 保存配置到文件
     * @param configPath 配置文件路径，默认为mqconfig.json
     * @return 保存是否成功
     */
    bool saveConfig(const QString& configPath = "mqconfig.json");

    /**
     * @brief 获取当前配置
     * @return 当前配置结构体
     */
    MQConfig getConfig() const;

    /**
     * @brief 设置配置
     * @param config 新的配置结构体
     */
    void setConfig(const MQConfig& config);

    /**
     * @brief 获取连接配置
     * @return 连接配置结构体
     */
    MQConnectionConfig getConnectionConfig() const;

    // 性能、可靠性、日志配置已硬编码，不再提供getter方法
    
    /**
     * @brief 获取业务配置
     * @return 业务配置结构体
     */
    MQBusinessConfig getBusinessConfig() const;

    /**
     * @brief 验证配置有效性
     * @param config 要验证的配置
     * @return 验证结果和错误信息
     */
    QPair<bool, QString> validateConfig(const MQConfig& config) const;

signals:
    /**
     * @brief 配置改变信号
     */
    void configChanged();

    /**
     * @brief 配置加载错误信号
     * @param error 错误信息
     */
    void configLoadError(const QString& error);

private:
    /**
     * @brief 私有构造函数（单例模式）
     */
    explicit MQConfigManager(QObject *parent = nullptr);

    /**
     * @brief 从JSON对象解析配置
     * @param jsonObj JSON对象
     * @return 解析的配置结构体
     */
    MQConfig parseConfigFromJson(const QJsonObject& jsonObj) const;

    /**
     * @brief 将配置转换为JSON对象
     * @param config 配置结构体
     * @return JSON对象
     */
    QJsonObject configToJson(const MQConfig& config) const;

private:
    static MQConfigManager* m_instance;     ///< 单例实例
    static QMutex m_mutex;                  ///< 线程安全互斥锁
    MQConfig m_config;                      ///< 当前配置
    mutable QMutex m_configMutex;           ///< 配置访问互斥锁
};

#endif // MQCONFIGMANAGER_H
